QUIC的丢包恢复机制概述

我们简要的描述了QUIC在传输、ack接受(ack reception)以及计时器到期( timer expiration)时采取的措施。

发送一个数据包时(On Sending a Packet)

发送一个数据包时

一个重传计时器将会基于以下的规则被设立:

  • 如果握手还没有完成,则开始一个握手计时器

    • SRTT的1.5倍,具有指数退避。
  • 如果存在未完成(outstanding)且已被NACK的未完成数据包,则可能设置丢失计时器

    • 取决于丢失检测实现,在Early Retransmit的情况下默认为0.25RTT。
  • 如果发送的TLP(Tail Loss Probe)少于2个,则计算并重新启动TLP计时器。

    • 如果线路中有多个数据包,则定时器设置为(10ms,2 * SRTT)中的较大值
    • 如果线路中只有一个数据包,则将定时器设置为(1.5*SRTT + delayed ack timer, 2*SRTT)中的较大值
  • 如果发送的TLP达到了两个,则设定RTO计时器

    • 计时器在第一个RTO过了之后将被设定为(200ms, SRTT+4*RTTVAR)中的较大值,且满足指数退避。

接收一个ACK时(On Receiving an ACK)

接收一个ACK时

以下的步骤为当一个ACK被接收时采取的措施:

  • 验证ack,包括忽略任何无序的确认。
  • 更新RTT测量器
  • 发送端以ACKED标记序列号低于最大观测范围(largest_observed)且未被NACK的数据包
  • 数据包编号小于最大观测值(largest_observed)且未被NACK的具有基于FACK递增的missing_reports值。(largest_observed - 丢失数据包编号)
  • 阈值(Threshold)被默认的设定为3
  • 具有missing_reports值且missing_reports > Threshold 的数据包被标记为需要重传。该逻辑一起实现了快速重传和基于FACK的重传。
  • 如果nacked数据包未完成且观察到的最大数据包是最大发送数据包,则重传计时器将设置为0.25SRTT,实现具有计时器的Early Retransmit。
  • 如果不存在未完成的数据包,则停止计时器

计时器停止时(On Timer Expiration)

QUIC使用一个丢失恢复计时器,该计时器在设置时可以处于多种状态之一。 当计时器到期时,状态确定要执行的动作。 (TODO:描述定时器何时设置)

  • 握手(Handshake)状态
    • 重传任何未完成握手的数据包
  • 丢包计时(Loss timer)状态
    • 丢失到目前为止已被NACK的未完成数据包。
    • 将丢包情况报告给拥塞控制器。
    • 在拥塞控制器允许的范围内尽可能多的重传
  • 尾包丢失检测(TLP)状态
    • 重传最小的可重传的未完成数据包。
    • 在ACK到达之前,不要将任何数据包标记为丢失。
    •  重启TLP或RTO的计时器。
  • 重传超时时间(Retransmission TimeOut)状态
    • 不要使拥塞窗口骤减(即:设置为1个数据包),直到ack到达并确认RTO不是虚假的。 请注意,此步骤不需要实施FRTO。
    • 重启下一个RTO的定时器(带指数退避)。